home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / iplink / iplinkp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  12.5 KB  |  538 lines

  1. /*    PC98<->IBM<->FMR ファイル転送 for PC98 Copyright (c) E.Suto  , 1992-1993*/
  2. /*    修正履歴  Ver  0.00     1992/06/22     試作品                                    */
  3. /*              Ver  0.10     1992/06/23     近所公開版                                */
  4. /*              Ver  0.20     1992/06/26     簡易サーバーモード追加,共用ドライブ対応*/
  5. /*              Ver  0.21     1992/06/28     リモートコマンド追加                    */
  6. /*              Ver  0.30     1992/07/01     TIMEOUT()改造,オプション統合,速度表示    */
  7. /*              Ver  0.31     1992/07/03     簡易サーバーを出来るだけ止めないよう    */
  8. /*              Ver  0.32     1992/07/03     速度表示の0割り算ガード(超手抜き)    */
  9. /*              Ver  0.33     1992/07/06     . の消し方変更                            */
  10. /*              Ver  0.34     1992/07/10     受信ファイルがルートに行ってしまうバグ修正    */
  11. /*              Ver  0.35     1992/11/17     RS232Cのバグ修正(98版のみ)    */
  12. /*              Ver  0.36     1992/11/17     ちょっと高速化(^^;                        */
  13. /*              Ver  0.37     1992/11/18     タイマ値最適化                            */
  14. /*              Ver  0.38     1992/11/18     送信ファイル名バグ修正                    */
  15. /*              Ver  0.39     1992/11/18     サーバーバグ修正                        */
  16. /*              Ver  0.41     1993/02/04     inpのwaitを#defineに                    */
  17. /*              Ver  0.42     1993/02/04     ソースをちょっと統合(^^;                */
  18. /*              Ver  1.00     1993/ 2/ 3     失敗時にタイムアウトしない                */
  19. /*              Ver  1.01     1993/ 2/ 4     コマンド受信処理でタイムアウトしない    */
  20.  
  21. #include "iplink.h"
  22.  
  23. #define RS_IN        0x0033
  24. #define RS_OUT        0x0032
  25. #define PALAWAIT    0l    /* TIMEOUTが発生する場合はこの値を大きくしてね(^^; */
  26.  
  27. void main(int argc,char *argv[])
  28. {
  29.     int i , k , l , m ;
  30.     unsigned char *c ;
  31.  
  32.     debug    = 0 ;
  33.     mode    = -1 ;
  34.     strcpy( command , "" ) ;
  35.     strcpy( path , "" ) ;
  36.  
  37. /* コピーライト表示 */
  38.     copyright() ;
  39.  
  40. /* 割り込み処理定義 */
  41.     signal( SIGINT , sig_out ) ;
  42.  
  43. /* オプションチェック */
  44.     if( argc < 2 ) {
  45.         usage() ;
  46.         exit( 0 ) ;
  47.     }
  48.     else {
  49.         k = l = 0 ;
  50.         for( i=1 ; i<argc ; i++ ) {
  51.             c = argv[i] ;
  52.             if( *c == '-' || *c == '/' ) {
  53.                 switch( *++c ) {
  54.                 case '?' :
  55.                     usage();
  56.                     exit( 0 );
  57.                 case 'i' :
  58.                 case 'I' :
  59.                     debug = -1 ;
  60.                     break ;
  61.                 case 'R' :
  62.                 case 'r' :
  63.                     if( k ) mode = 4 ;
  64.                     else mode = 1 ;
  65.                     break ;
  66.                 case 'S' :
  67.                 case 's' :
  68.                     mode = 0 ;
  69.                     break ;
  70.                 case 'Z' :
  71.                 case 'z' :
  72.                     mode = 2 ;
  73.                     break ;
  74.                 case 'C' :
  75.                 case 'c' :
  76.                     mode = 5 ;
  77.                     c++ ;
  78.                     strcpy( command , c ) ;
  79.                     if( command[0] == '"' ) {
  80.                         for( ; i < argc ; ) {
  81.                             i++ ;
  82.                             strcat( command , " " ) ;
  83.                             strcat( command , argv[i] ) ;
  84.                             if( command[strlen( command ) - 1 ] == '"' ) 
  85.                                 break ;
  86.                         }
  87.                     }
  88.                     break ;
  89.                 case 'X' :
  90.                 case 'x' :
  91.                     c++ ;
  92.                     strcpy( path , c ) ;
  93.                     l = -1 ;
  94.                     break ;
  95.                 default :
  96. perr:                    printf( "ファイル名が2つ以上指定されているか、誤ったパラメタ(%s)が指定されています。\n" , argv[i] ) ;
  97.                     usage() ;
  98.                     exit( -1 ) ;
  99.                 }
  100.             }
  101.             else {
  102.                 if( mode == 5 ) {
  103.                     if( strlen( command ) > 0 ) goto perr ;
  104.                     strcpy( command , c ) ;
  105.                     if( command[0] == '"' ) {
  106.                         for( ; i < argc ; ) {
  107.                             i++ ;
  108.                             strcat( command , " " ) ;
  109.                             strcat( command , argv[i] ) ;
  110.                             if( command[strlen( command ) - 1 ] == '"' ) 
  111.                                 break ;
  112.                         }
  113.                     }
  114.                     else {
  115.                         for( ; i < argc ; ) {
  116.                             i++ ;
  117.                             if( ( *(argv[i]) == '-' ) || ( *(argv[i]) == '/' ) ) 
  118.                                 break ;
  119.                             strcat( command , " " ) ;
  120.                             strcat( command , argv[i] ) ;
  121.                         }
  122.                     }
  123.                 }
  124.                 else {
  125.                     if( k ) goto perr ;
  126.                     strcpy( name , argv[i] ) ;
  127.                     k = -1 ;
  128.                     if( mode == 1 ) mode = 4 ;
  129.                 }
  130.             }
  131.         }
  132.     }
  133.  
  134. /* オプションの関連チェック */
  135.     if( mode == -1 ) {
  136.         printf( "-r,-s,-z又は-c,の何れかを指定してください。\n" ) ;
  137.         usage() ;
  138.         exit( -1 ) ;
  139.     }
  140.     if( !( k ) && ( mode == 0 ) ) {
  141.         printf( "-s指定時にはファイル名を省略できません。\n" ) ;
  142.         usage() ;
  143.         exit( -1 ) ;
  144.     }
  145.     if( l && ( mode != 0 ) ) {
  146.         printf( "-s 指定時以外にはでは、-xは指定できません。\n" ) ;
  147.         usage() ;
  148.         exit( -1 ) ;
  149.     }
  150.     if( mode == 5 ) {
  151.         strcpy( buffer , command ) ;
  152.         if( buffer[0] == '"' ) {
  153.             m = strlen( buffer ) ;
  154.             if( buffer[m-1] != '"' ) {
  155.                 printf( " コマンドの終わりを示す\"が不足しています。(%s)\n",buffer ) ;
  156.                 usage() ;
  157.                 exit( -1 ) ;
  158.             }
  159.             buffer[m-1] = 0x00 ;
  160.             strcpy( command , ( buffer + 1 ) ) ;
  161.         }
  162.         if( strlen( command ) == 0 ) {
  163.             printf( "-c に続いてリモートコマンドを指定してください。\n" ) ;
  164.             usage() ;
  165.             exit( -1 ) ;
  166.         }
  167.         if( strlen( command ) > 114 ) {
  168.             printf( "申し訳有りませんがコマンドが長すぎます。114文字以下にしてください。\n" ) ;
  169.             usage() ;
  170.             exit( -1 ) ;
  171.         }
  172.     }
  173.  
  174. /* タイムアウト値設定 */
  175.     timeset() ;
  176.  
  177. /* 回線の初期化 */
  178.     rs_init() ;
  179.  
  180. /* 送受信処理へ */
  181.     switch( mode ) {
  182.         case 0 :                /* 送信処理 */
  183.             connect_s() ;
  184.             fp_send() ;
  185.             break ;
  186.         case 1 :                /* 受信処理 */
  187.             connect_r() ;
  188.             fp_receive0() ;
  189.             fp_receive() ;
  190.             break ;
  191.         case 2 :                /* サーバー処理 */
  192.             fp_server() ;
  193.             break ;
  194.         case 4 :                /* サーバーからの受信処理 */
  195.             connect_s() ;
  196.             fp_file() ;
  197.             fp_receive0() ;
  198.             fp_receive() ;
  199.             break ;
  200.         case 5 :                /* リモートコマンド処理 */
  201.             connect_s() ;
  202.             fp_command() ;
  203.             break ;
  204.     }
  205.  
  206. /* 後始末 */
  207.     printf( "電送処理終了しました。\n" ) ;
  208.     rs_init() ;
  209.  
  210. }
  211.  
  212. /* 接続確認待ち(送信型)*/
  213. int connect_s()
  214. {
  215.     unsigned char stat ;
  216.  
  217. /* 接続確認 */
  218.     if( mode != 2 ) printf( "接続待ちです。\n" ) ;
  219.     outp( RS_OUT , 0x02 ) ;        /* ずーと待つからsendは使わない        */
  220.     stat = 0x7f ;
  221.     while( ( inp( RS_IN ) | 0x3f ) != stat ) {
  222.         printf( "*\r" ) ;
  223.         if( kbhit() ) {
  224.             if( getch() == 0x1b ) sig_out() ;
  225.         }
  226.     }
  227.  
  228.     outp( RS_OUT , 0x20 ) ;        /* ずーと待つからsendは使わない        */
  229.     stat = 0xbf ;
  230.     while( ( inp( RS_IN ) | 0x3f ) != stat ) {
  231.         printf( "*\r" ) ;
  232.         if( kbhit() ) {
  233.             if( getch() == 0x1b ) sig_out() ;
  234.         }
  235.     }
  236.  
  237.     buffer[0] = 0xe4 ;            /* このへんの文字は何でも良い(^^;    */
  238.     if ( send( 1 , buffer ) ) {
  239.         if( mode == 2 ) return( -1 ) ;
  240.         timeout() ;
  241.     }
  242.     if( debug ) printf( "送信接続OK。\n" ) ;
  243.     return( 0 ) ;
  244.  
  245. }
  246.  
  247. /* 回線送信処理 */
  248. int send( int l , unsigned char *b )
  249. {
  250.     int i ;
  251.     long k ;
  252.     unsigned char stat0,stat1,data ;
  253.  
  254. /* 1バイトを8つに区切って1ビット毎に送信 */
  255.     for( i = 0 ; i < l ; i++ ) {
  256. /* ビット7送信 */
  257.         data = 0x00 ;
  258.         stat0 = 0xff ;
  259.         if( (*b) & 0x80 ) {
  260.             data |= 0x02 ;
  261.             stat0 &= 0x7f ;
  262.         }
  263.         outp( RS_OUT , data ) ;
  264. /* ビット6送信 */
  265.         data = 0x20 ;
  266.         stat1 = 0xbf ;
  267.         if( (*b) & 0x40 ) {
  268.             data |= 0x02 ;
  269.             stat1 &= 0x7f ;
  270.         }
  271.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat0 ; k-- ) {
  272.             if( !( k ) ) return( -1 ) ;
  273.         }
  274.         outp( RS_OUT , data ) ;
  275. /* ビット5送信 */
  276.         data = 0x00 ;
  277.         stat0 = 0xff ;
  278.         if( (*b) & 0x20 ) {
  279.             data |= 0x02 ;
  280.             stat0 &= 0x7f ;
  281.         }
  282.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat1 ; k-- ) {
  283.             if( !( k ) ) return( -1 ) ;
  284.         }
  285.         outp( RS_OUT , data ) ;
  286. /* ビット4送信 */
  287.         data = 0x20 ;
  288.         stat1 = 0xbf ;
  289.         if( (*b) & 0x10 ) {
  290.             data |= 0x02 ;
  291.             stat1 &= 0x7f ;
  292.         }
  293.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat0 ; k-- ) {
  294.             if( !( k ) ) return( -1 ) ;
  295.         }
  296.         outp( RS_OUT , data ) ;
  297. /* ビット3送信 */
  298.         data = 0x00 ;
  299.         stat0 = 0xff ;
  300.         if( (*b) & 0x08 ) {
  301.             data |= 0x02 ;
  302.             stat0 &= 0x7f ;
  303.         }
  304.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat1 ; k-- ) {
  305.             if( !( k ) ) return( -1 ) ;
  306.         }
  307.         outp( RS_OUT , data ) ;
  308. /* ビット2送信 */
  309.         data = 0x20 ;
  310.         stat1 = 0xbf ;
  311.         if( (*b) & 0x04 ) {
  312.             data |= 0x02 ;
  313.             stat1 &= 0x7f ;
  314.         }
  315.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat0 ; k-- ) {
  316.             if( !( k ) ) return( -1 ) ;
  317.         }
  318.         outp( RS_OUT , data ) ;
  319. /* ビット1送信 */
  320.         data = 0x00 ;
  321.         stat0 = 0xff ;
  322.         if( (*b) & 0x02 ) {
  323.             data |= 0x02 ;
  324.             stat0 &= 0x7f ;
  325.         }
  326.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat1 ; k-- ) {
  327.             if( !( k ) ) return( -1 ) ;
  328.         }
  329.         outp( RS_OUT , data ) ;
  330. /* ビット0送信 */
  331.         data = 0x20 ;
  332.         stat1 = 0xbf ;
  333.         if( (*b) & 0x01 ) {
  334.             data |= 0x02 ;
  335.             stat1 &= 0x7f ;
  336.         }
  337.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat0 ; k-- ) {
  338.             if( !( k ) ) return( -1 ) ;
  339.         }
  340.         outp( RS_OUT , data ) ;
  341.         for( k = timeout1 ; ( inp( RS_IN ) | 0x3f ) != stat1 ; k-- ) {
  342.             if( !( k ) ) return( -1 ) ;
  343.         }
  344. /* 次のバイト処理へ */
  345.         b++ ;
  346.     }
  347.     return( 0 ) ;
  348.  
  349. }
  350.  
  351. /* 接続確認待ち(受信型)*/
  352. int connect_r()
  353. {
  354.     unsigned char stat ;
  355.  
  356. /* 接続確認 */
  357.     if( mode != 2 ) printf( "接続待ちです。\n" ) ;
  358.     stat = 0x7f ;
  359.     while( ( inp( RS_IN ) | 0x3f ) != stat ) {
  360.         printf( "*\r" ) ;
  361.         if( kbhit() ) {
  362.             if( getch() == 0x1b ) sig_out() ;
  363.         }
  364.     }
  365.     outp( RS_OUT , 0x02 ) ;        /* ずっと待ちたいからreceiveを使わない    */
  366.  
  367.     stat = 0xbf ;
  368.     while( ( inp( RS_IN ) | 0x3f ) != stat ) {
  369.         printf( "*\r" ) ;
  370.         if( kbhit() ) {
  371.             if( getch() == 0x1b ) sig_out() ;
  372.         }
  373.     }
  374.     outp( RS_OUT , 0x20 ) ;        /* ずっと待ちたいからreceiveを使わない    */
  375.  
  376.     if( receive( 1 , buffer ) ) {
  377.         if( mode == 2 ) return( -1 ) ;
  378.         timeout() ;
  379.     }
  380.     if( buffer[0] != 0xe4 ) {    /* このへんの文字は送信側に合わせる        */
  381.         printf( "接続確認処理でエラーが発生しました。\n" ) ;
  382.         if( mode == 2 ) return( -1 ) ;
  383.         rs_init() ;
  384.         exit( -1 ) ;
  385.     }
  386.     if( debug ) printf( "受信接続OK。\n" ) ;
  387.     return( 0 ) ;
  388.  
  389. }
  390.  
  391. /* 回線受信処理 */
  392. int receive( int l , unsigned char *b )
  393. {
  394.     int i ;
  395.     long k , t ;
  396.     unsigned char data ;
  397.  
  398. /* 1ビットを8つ受信で1バイト */
  399.     for( i = 0 ; i < l ; i++ ) {
  400.         *b = 0x00 ;
  401. /* ビット7受信 */
  402.         for( k = timeout1 ; !(inp( RS_IN ) & 0x40) ; k-- ) {
  403.             if( !( k ) ) return( -1 ) ;
  404.         }
  405.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  406.         data = 0x00 ;
  407.         if( !( inp( RS_IN ) & 0x80 ) ) {
  408.                 (*b) |= 0x80 ;
  409.             data |= 0x02 ;
  410.         }
  411.         outp( RS_OUT , data ) ;
  412. /* ビット6受信 */
  413.         for( k = timeout1 ; inp( RS_IN ) & 0x40 ; k-- ) {
  414.             if( !( k ) ) return( -1 ) ;
  415.         }
  416.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  417.         data = 0x20 ;
  418.         if( !( inp( RS_IN ) & 0x80 ) ) {
  419.                 (*b) |= 0x40 ;
  420.             data |= 0x02 ;
  421.         }
  422.         outp( RS_OUT , data ) ;
  423. /* ビット5受信 */
  424.         for( k = timeout1 ; !(inp( RS_IN ) & 0x40) ; k-- ) {
  425.             if( !( k ) ) return( -1 ) ;
  426.         }
  427.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  428.         data = 0x00 ;
  429.         if( !( inp( RS_IN ) & 0x80 ) ) {
  430.                 (*b) |= 0x20 ;
  431.             data |= 0x02 ;
  432.         }
  433.         outp( RS_OUT , data ) ;
  434. /* ビット4受信 */
  435.         for( k = timeout1 ; inp( RS_IN ) & 0x40 ; k-- ) {
  436.             if( !( k ) ) return( -1 ) ;
  437.         }
  438.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  439.         data = 0x20 ;
  440.         if( !( inp( RS_IN ) & 0x80 ) ) {
  441.                 (*b) |= 0x10 ;
  442.             data |= 0x02 ;
  443.         }
  444.         outp( RS_OUT , data ) ;
  445. /* ビット3受信 */
  446.         for( k = timeout1 ; !(inp( RS_IN ) & 0x40) ; k-- ) {
  447.             if( !( k ) ) return( -1 ) ;
  448.         }
  449.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  450.         data = 0x00 ;
  451.         if( !( inp( RS_IN ) & 0x80 ) ) {
  452.                 (*b) |= 0x08 ;
  453.             data |= 0x02 ;
  454.         }
  455.         outp( RS_OUT , data ) ;
  456. /* ビット2受信 */
  457.         for( k = timeout1 ; inp( RS_IN ) & 0x40 ; k-- ) {
  458.             if( !( k ) ) return( -1 ) ;
  459.         }
  460.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  461.         data = 0x20 ;
  462.         if( !( inp( RS_IN ) & 0x80 ) ) {
  463.                 (*b) |= 0x04 ;
  464.             data |= 0x02 ;
  465.         }
  466.         outp( RS_OUT , data ) ;
  467. /* ビット1受信 */
  468.         for( k = timeout1 ; !(inp( RS_IN ) & 0x40) ; k-- ) {
  469.             if( !( k ) ) return( -1 ) ;
  470.         }
  471.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  472.         data = 0x00 ;
  473.         if( !( inp( RS_IN ) & 0x80 ) ) {
  474.                 (*b) |= 0x02 ;
  475.             data |= 0x02 ;
  476.         }
  477.         outp( RS_OUT , data ) ;
  478. /* ビット0受信 */
  479.         for( k = timeout1 ; inp( RS_IN ) & 0x40 ; k-- ) {
  480.             if( !( k ) ) return( -1 ) ;
  481.         }
  482.         for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
  483.         data = 0x20 ;
  484.         if( !( inp( RS_IN ) & 0x80 ) ) {
  485.                 (*b) |= 0x01 ;
  486.             data |= 0x02 ;
  487.         }
  488.         outp( RS_OUT , data ) ;
  489. /* 次のバイト処理へ */
  490.         b++ ;
  491.     }
  492.     return( 0 ) ;
  493.  
  494. }
  495.  
  496. /* 8251の初期化 */
  497. void rs_init()
  498. {
  499.     int i , j ;
  500.  
  501. /* 状態のリセット */
  502.     for( i = 0 ; i < 3 ; i++ ) {
  503.         outp( RS_OUT , 0x00 ) ;
  504.         for( j = 0 ; j < 3 ; j++ ) ; /* 念のため時間待ち */
  505.     }
  506.     outp( RS_OUT , 0x40) ;
  507.  
  508. /* モードセット */
  509.     outp( RS_OUT , 0x4e) ;
  510.     for( j = 0 ; j < 6 ; j++ ) ; /* 念のため時間待ち */
  511.  
  512. /* エラーリセット */
  513.     outp( RS_OUT , 0x37) ;
  514.     for( j = 0 ; j < 6 ; j++ ) ; /* 念のため時間待ち */
  515.  
  516. }
  517.  
  518. /* コピーライト表示 */
  519. void copyright()
  520. {
  521.     printf(
  522.         "IBM<=>98<=>FMR ファイル電送 for NEC Ver 1.01, Copyright (C) E.Suto , 1992-1993\n"
  523.         ) ;
  524. }
  525.  
  526. /* 使い方表示 */
  527. void usage()
  528. {
  529.     printf( "使用法                 : IPLINKP [options] [file-name]\n" ) ;
  530.     printf( "オプション -s            : ファイル送信(要送信ファイル名)\n" ) ;
  531.     printf( "      -r            : ファイル受信\n" ) ;
  532.     printf( "      -z            : サーバーモード\n" ) ;
  533.     printf( "      -cリモートコマンド  : サーバーにリモートコマンドを送信\n" ) ;
  534.     printf( "      -x[path_name] : -sでの格納先パス名\n" ) ;
  535.     printf( "          -i            : 詳細情報表示\n" ) ;
  536. }
  537.  
  538.